package com.beifeng.hadoop.hdfs;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FSDataInputStream;
import org.apache.hadoop.fs.FSDataOutputStream;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;
import org.junit.Before;
import org.junit.Test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URI;


/**
 * Created by Administrator on 2017/3/21.
 */

/**
 * @Before 初始化方法
 * @Test 测试方法
 */
public class HDFSOperate {
    FileSystem   fs = null;  //创建一个hdfs的分布式文件对象

    @Before
    public void getFs() throws Exception {
        //1.获取一个FileSysem
        fs = FileSystem.get(
                new URI("hdfs://bigdata01:8020"),   //连接到哪个namenode
                new Configuration(),   //获取hdfs的配置信息
                "cmz"   //hdfs的用户
        );

    }

    //测试下载
    @Test
    public void testDownload() throws IOException {
        //下载HDFS的文件  HDFS -> 内存  hadoop.fs.FSDataInputStream
        FSDataInputStream in = fs.open(new Path("/second.txt"));

        //构造一个输出流  内存 -> 本地文件  java.io.FileOutputStream
        FileOutputStream out = new FileOutputStream("D:\\wordcount.txt");

        IOUtils.copyBytes(in,out,4096,true);
        /**
         * 参数说明
         * in -输入源
         * out -输出源
         * 4096 - 缓冲区的大小
         * true - 是否关闭数据流，如果false,就finally里关闭
         */

    }

    //测试上传 输入输出流要参考对象
    @Test
    public void testUpload() throws IOException {
        //构造一个输出流 内存->HDFS 使用的是hadoop的IO流
        FSDataOutputStream out = fs.create(new Path("/hadoop1"), true);
        /**
         * new path() --要创建的文件
         * true 是否要覆盖
         */
        //构造一个输入流 本地文件->内存 使用的是java的io流
        FileInputStream in = new FileInputStream("D:\\test.txt");

        IOUtils.copyBytes(in,out,4096,true);
    }

    //创建文件夹
    @Test
    public void testMkdir() throws IOException {
        boolean mkdirs = fs.mkdirs(new Path("/upload/testMkdir"));
        System.out.print("在HDFS是否成功创建目录：" + mkdirs);
    }

    //删除目录
    @Test
    public void testRmdir() throws IOException {
        boolean rmdirs = fs.delete(new Path("/upload/testMkdir"),true);
        /**
         * new Path - 要删除的对象
         * true - 是否要递归删除
         */

        System.out.print("在HDFS是否删除创建目录：" + rmdirs);
    }
}
